package com.songlanyun.modules.coupon.model.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.songlanyun.common.drive.ValueObject;
import com.songlanyun.modules.coupon.model.vo.AdaptActivityVo;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;

import javax.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Set;

@Data
public class CouponEntityDTO implements ValueObject {
    {
        threshold = BigDecimal.ZERO;
        issueNumber = -1;
        expiredDay = 7;
        adaptOrNo = true;
        receiveNum = 0;
    }
    /**
     *
     */
    private Long id;
    /**
     * 优惠券名称
     */
    @NotBlank(message = "优惠券名称不能为空")
    @Length(min = 1, max = 20, message = "优惠券名称在1-20个字")
    private String name;
    /**
     * 优惠券范围 0:平台券，1:店铺券
     */
    @Range(min = 0,max = 1,message = "只能选持平台券或店铺券")
    private Integer mode;

    /**
     * 优惠券特征 0:普通券，1:新人券
     */
    @Range(min = 0,max = 1,message = "只能选持普通券或新人券")
    private Integer trait;

    /**
     * 优惠券状态 0已终止，1待发布，2已发布
     */
    @Range(min = 0,max = 2,message = "只能待发布、已发布、已终止")
    private Integer status;
    /**
     * 是否是通用券
     */
    private Boolean universal;
    /**
     * 优惠券类型 0:满减券
     */
    @Range(min = 0,max = 0,message = "优惠券类型只能是满减券")
    private Integer type;
    /**
     * 优惠券优惠额度
     */
    @NotNull(message = "必须填写优惠额度")
    @DecimalMin(value = "0.01",message = "优惠额度最小值是0.1")
    @DecimalMax(value = "999999",message = "优惠额度最大值是999999")
    private BigDecimal faceValue;
    /**
     * 是否存在门槛
     */
    @NotNull(message = "必须选择是否存在门槛")
    private Boolean hasThreshold;
    /**
     * 门槛值
     */
    @NotNull(message = "必须门槛值")
    @DecimalMin(value = "0",message = "门槛值最小值是0")
    @DecimalMax(value = "99999999",message = "门槛值最大值是99999999")
    private BigDecimal threshold;
    /**
     * 发行数量(-1代表不限量)
     */
    @Range(min = -1,max = 9999999,message = "发行数量在-1到9999999")
    private Integer issueNumber;

    /**
     * 领取后过期天数
     */
    @Range(min = 1,max = 999,message = "领取后过期天数最少是1天，最大是999天")
    private Integer expiredDay;
//    /**
//     * 0000001，适应首单优惠1，00000010适应秒杀2，00000100适应拼团4
//     */
//    private Integer adaptActivity;

    private List<AdaptActivityVo> adaptActivityData;

    /**
     * 剩余数量
     */
    private Integer receiveNum;

    /**
     * 每人限领多少张（用了之后给再领取，-1代表不能限领）
     */
    @Range(min = -1,max = 999,message = "每人限领-1-999张")
    private Integer receiveLimit;
    /**
     * 开始时间
     */
    @NotNull(message = "必须填写开始时间")
    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
    private Date startTime;

    /**
     * 结束时间
     */
    @NotNull(message = "必须填写结束时间")
    @JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm")
    private Date endTime;
    /**
     * 发行的店铺
     */
    @NotNull(message = "必须填写发行的店铺Id")
    private Long shopId;

    /**
     * 适合或不适合（如果是平台券非通用券，指的是指定的店铺是适合或不适合，
     * 如果是店铺券非通用券，指的是指定的商品是适合或不适合）
     */
    private Boolean adaptOrNo;

    /**
     * 描述
     */
    private String content;

    /**
     * 如果是店铺券，那些商品适合或不适合
     */
    private Set<Long> adaptGoodsIds;
    /**
     * 如果是平台券，那些店铺适合或不适合
     */
    private Set<Long> adaptShopIds;
}
